# normalize.py
import numpy as np

"""
    首先，函数接受一个名为"features"的参数，这个参数是一个特征矩阵。
    然后，代码创建了一个名为"features_normalized"的变量，它是输入特征的副本，并转换为浮点型数据。
    接下来，代码计算了特征矩阵每列的均值，将结果存储在"features_mean"变量中。
    然后，代码计算了特征矩阵每列的标准差，将结果存储在"features_deviation"变量中。
    如果特征矩阵的行数大于1，代码会将"features_normalized"减去"features_mean"。这是为了将特征矩阵的每个特征都减去它们的均值。
    接着，代码将"features_deviation"中值为0的元素替换为1，以避免除以0的错误。
    最后，代码通过将"features_normalized"除以"features_deviation"来完成归一化操作。
    函数返回三个值，分别是归一化后的特征矩阵"features_normalized"，特征矩阵每列的均值"features_mean"和特征矩阵每列的标准差"features_deviation"。
"""


def normalize(features):
    # 创建一个与输入特征矩阵相同的副本，并将其转换为浮点型
    features_normalized = np.copy(features).astype(float)
    # 计算均值
    features_mean = np.mean(features, 0)
    # 计算标准差
    features_deviation = np.std(features, 0)
    # 标准化操作
    if features.shape[0] > 1:
        features_normalized -= features_mean
    # 防止除以0，将标准差中为0的元素替换为1，并将特征矩阵除以标准差
    features_deviation[features_deviation == 0] = 1
    features_normalized /= features_deviation
    # 函数返回标准化后的特征矩阵、特征的均值和标准差
    return features_normalized, features_mean, features_deviation